{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 临界资源为何物 \n",
    "先看看百度百科给出的解释(https://baike.baidu.com/item/%E4%B8%B4%E7%95%8C%E8%B5%84%E6%BA%90/1880269?fr=aladdin):\n",
    "\n",
    "临界资源:多道程序系统中存在许多进程，它们共享各种资源，然而有很多资源一次只能供一个进程使用。一次仅允许一个进程使用的资源称为临界资源。许多物理设备都属于临界资源，如输入机、打印机、磁带机等。\n",
    "\n",
    "举个通俗点的例子:一桌人吃饭(中国作为美食大国，拿吃举例是最形象的，我就是的吃货)，上了一大碗“海鲜全家福”(最爱里面的扇贝丁和虾仁)，只有一个公用勺(要讲餐桌礼仪，只能用公用勺取菜)，这个公用勺就是“临界资源”，A拿了公用勺后，B、C、D等诸位只能等着，不然群起而拿之，一个公用勺同时有4只手，这场面不忍直视。\n",
    "\n",
    "对于公用勺(临界资源)的使用我们要有保护，我们用餐桌礼仪约定(进程间同步的锁)来规范公用勺(临界资源)的使用。\n",
    "\n",
    "上述够形象吧:)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 锁?你说的是大门锁吗\n",
    "当然不是了，但起到的作用和大门锁一致——你想进房间，先拿到钥匙，用完房间后，把钥匙归还；在这期间，其他人要用房间，只能等着，拿到钥匙才能继续使用。这里的房间就是“临界资源”。\n",
    "\n",
    "操作系统为我们提供了哪些“临界资源”的保护机制。\n",
    "\n",
    "操作系统为我们提供的保护机制就是锁。这个锁包含:互斥锁、读写锁、自旋锁。\n",
    "\n",
    "(1)互斥锁。同一时刻，只能有1个进程访问临界资源。\n",
    "\n",
    "(2)读写锁。多了读临界资源的进程可用同时访问，但写临界资源的进程一旦访问，所有使用临界资源的进程都要等待着该进程结束后，才能访问临界资源。\n",
    "\n",
    "适用场合:预估您的系统中，对该临界资源的读操作次数大于写操作的次数，此时读写锁就可以带来比互斥锁更好的性能。\n",
    "\n",
    "读写锁存在的原因:读操作不改变临界资源的值，读操作相当与您看看临界资源，看也不会咋样，所有可以由多个进程访问；但写就不一样，一旦写后，临界资源就被改变了，所有写操作由只能一个进程来进行。\n",
    "\n",
    "(3)自旋锁。只在内核中使用，而且只在有多核处理器的情况使用。\n",
    "\n",
    "自旋锁，就是一直死等着临界资源，同时占着CPU不放，就在原地跑圈(也不怕自己转晕了:))。\n",
    "\n",
    "在使用互斥锁、读写锁时，等待锁期间，该进程是被拉入锁的等待队列中的，进程处于睡眠态，其他进程被拉入CPU进行操作；但使用自旋锁时，不释放CPU，就在那空等；\n",
    "\n",
    "那为什么要引入自旋锁呢? 就是效率问题，如果临界资源很快可使用，此时，获取到了自旋锁使用权限，继续执行后续代码；但使用互斥锁和读写锁则引入进程(或内核线程)频繁的切入、切出CPU的运行队列，耗费了大量时间，降低了系统的性能；这就是自旋锁适用的场合。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Multiprocessing模块提供的进程间同步机制\n",
    "multiprocessing支持进程同步机制——锁(互斥锁)。同一时刻只有一个进程可以获取锁。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Help on method Lock in multiprocessing:\n",
      "\n",
      "multiprocessing.Lock = Lock() method of multiprocessing.context.DefaultContext instance\n",
      "    Returns a non-recursive lock object\n",
      "\n"
     ]
    }
   ],
   "source": [
    "help(\"multiprocessing.Lock\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
